package com.hzg.springcloud.service.impl;

import com.hzg.springcloud.Order;
import com.hzg.springcloud.fegin.IProductFeignApi;
import com.hzg.springcloud.domain.Product;
import com.hzg.springcloud.service.IOrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.UUID;

@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {
    //product-server 服务地址
    /* 没有使用ribbon组件的均衡器的时候--->方法一
    public static final String PRODUCT_URL="http://localhost:8080";
    这种方式存在方式存在的问题:写死product-server 的ip端口,后续如果product-server 做了集群
    那么这种方式就无法使用集群中其他product-server 服务,比如说端口号为 8081的这个服务
    此时解决方案:使用ribbon组件里面负载均衡器(狭义的理解多个服务平均分配请求)功能
    因为用进行均衡器调用,此时需要用的是Eureka中product-server服务名
    因为Eureka中可以通过服务名获取product-server所有服务集群的ip与端口
     */
    //方式二  ribbon组件的均衡器操作实现集群
    //public static final String PRODUCT_URL="http://PRODUCT-SERVER";//自动去注册中心拿地址值  不需要了解  底层做的
    //@Autowired
    //private RestTemplate restTemplate;//为什么不存在跨域  把这个restTemplate当成浏览器和http跨域请求的是不一样的就行了  //a项目内部通过ajax的方式发送http跨域请求问题会存在跨域问题------>方式一和方式二都要使用
    //方式三  定义Fegin接口
//因为之前的存在硬编码和参数不可控的问题
    //改用feign接口方式
    @Autowired
    private IProductFeignApi productFeignApi;
    @Override
    public Order save(Long userId, Long productId) {

//拿数据
        //http请求方式获取product-server 服务里面的访问信息
        //Product product = restTemplate.getForObject(PRODUCT_URL+"/products/get/"+productId, Product.class);
//使用的是 feign接口方式调用
        Product product = productFeignApi.get(productId);
        //Product product = null;//远程获取  假装通过远程调用product-server
        Order order = new Order();
        order.setOrderNo(UUID.randomUUID().toString().replace("-",""));
        order.setCreateTime(new Date());
        order.setUserId(userId);
        order.setProductName(product.getName());//因为现在是假装的,所以会报空指针错误  思考>怎么从该项目消费者8090拿到8080端口提供者商品的信息
                                                            //和之前的短信一样 为http交互项目  所以使用SpringMVC自带的核心类 RestTemplate
        order.setProductPrice(product.getPrice());
        //System.out.println("执行保存订单操作");
        //System.out.println("OrderServiceImpl.....save....");
        log.info("OrderServiceImpl.....save....");
        return order;
    }
}